desc: sault :: Lowpass Bessel filter

slider1:15000<100,15000,1>Lowpass Fc

@init


function set_bessel_lp(freq)
 instance(a1, a2, b0, b1, b2, w, x)
  local(x2,x3)
(
  w = srate/96000;
  x = freq/srate*w*2;

  x2 = x*x;
  x3 = x2*x;


  x < 0.3 ? (

    a1 = 6.429547294*x3 - 7.788639818*x2 + 6.899731386*x - 1.999899285;
    a2 = (1.769897748*x2 - 1.455941562*x + 0.3541985545)
      / (x + 0.3541587638); );
    b0 = (0.9639760781*x2 - 0.002724337466*x + 0.00001356834691)
      / (x + 0.2209853467);
    b1 = 2.369030004*x - 0.8735992719*x^0.5 + 0.09768291272;

  x < 0.1 ? (

    b1 = -17.60620454*x3 + 7.538535812*x2 + 0.005360429261*x - 0.00001191385;

    );

  x >= 0.3 ? (

    a1 = 2.341952621*x3 - 4.273886077*x2 + 5.826605889*x - 1.882441619;
    a2 = 1.407816786*x3 + 0.3086868738*x2 - 1.102257716*x + 0.3801550778;
    b0 = 0.9904707699*x3 - 1.116102102*x2 + 1.265296816*x - 0.1410808242;
    b1 = 0.4492967128*x3 + 0.1065912999*x2 + 1.397973646*x - 0.1112161959;
    );

  x >= 0.6 ? (

    a1 = 2.484754144*x3 - 4.692353679*x2 + 6.186042083*x - 1.978687231;
    b1 = 3.40723718*x3 - 5.547079153*x2 + 5.037594022*x - 0.8988484065;
    );

  b2 = b0;
);

function df1(in)
  instance(x0, x1, x2, y0, y1, y2, a1, a2, b0, b1, b2)
(
  x2 = x1; x1 = x0; x0 = in;
  y2 = y1; y1 = y0;
  y0 = 	b0*x0 + b1*x1 + b2*x2 - a1*y1 - a2*y2;
);


@slider

lp0.set_bessel_lp(slider1);
lp1.set_bessel_lp(slider1);


@sample

spl0 = lp0.df1(spl0);
spl1 = lp1.df1(spl1);

spl0 = max(min(spl0,1.5),-1.5);
spl1 = max(min(spl1,1.5),-1.5);